home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- * An OS2 2.x driver. *
- * *
- * Written by: Gershon Elber Ver 0.1, October 1993. *
- *****************************************************************************/
-
- #include <stdio.h>
-
- #define INCL_WINSTDFILE
- #define INCL_WININPUT
- #define INCL_WINFRAMEMGR
- #define INCL_WINMENUS
- #define INCL_DOSPROCESS
- #include <os2.h>
-
- #include "irit_sm.h"
- #include "genmat.h"
- #include "iritprsr.h"
- #include "allocate.h"
- #include "attribut.h"
- #include "ip_cnvrt.h"
- #include "cagd_lib.h"
- #include "iritgrap.h"
- #include "os2drvs.h"
- #include "irit_soc.h"
-
- #define ID_VIEW 1
- #define ID_TRANS 2
-
- #define DEFAULT_TRANS_WIDTH 200
- #define DEFAULT_TRANS_HEIGHT 500
- #define DEFAULT_VIEW_WIDTH 400
- #define DEFAULT_VIEW_HEIGHT 400
-
- #define ARGCV_LINE_LEN 1000
- #define ARGCV_MAX_WORDS 100
-
- #define RGB_COLOR(R, G, B) (((R) << 16) + ((G) << 8) + (B))
- #define GPI_MOVE(X, Y) { POINTL Pt; Pt.x = X; Pt.y = Y; GpiMove(hps, &Pt); }
- #define GPI_LINE(X, Y) { POINTL Pt; Pt.x = X; Pt.y = Y; GpiLine(hps, &Pt); }
- #define GPI_CHAR_STR_AT(Str, X, Y) { POINTL Pt; int l = strlen(Str); \
- Pt.x = X - cxChar * (l + 1) / 2; \
- Pt.y = Y - cyChar / 3; \
- GpiCharStringAt(hps, &Pt, l, Str); }
- #define OS2_MAP_X_COORD(x) ((int) (ViewWidth2 + x * ViewWidth2))
- #define OS2_MAP_Y_COORD(y) ((int) (ViewHeight2 + y * ViewWidth2))
-
- #define WIN_CHECK_MENU(Item, Val) WinSendMsg(hwndMenu, MM_SETITEMATTR, \
- MPFROM2SHORT(Item, TRUE), \
- MPFROM2SHORT(MIA_CHECKED, \
- (Val)));
-
- /* Interactive menu setup structure: */
- #define INTERACT_NUM_OF_STRINGS 3
- #define INTERACT_NUM_OF_SUB_WNDWS 15
- #define INTERACT_SUB_WINDOW_WIDTH 0.8 /* Relative to window size. */
- #define INTERACT_SUB_WINDOW_HEIGHT 0.04
-
- typedef struct InteractString {
- RealType X, Y;
- int Color;
- char *Str;
- } InteractString;
- typedef struct InteractSubWindow {
- RealType X, Y; /* Center points. */
- int Color;
- IGGraphicEventType Event;
- int TextInside; /* If TRUE, Str will be in window, otherwise left to it. */
- char *Str;
- } InteractSubWindow;
- typedef struct InteractWindowStruct { /* The interactive menu structures. */
- /* Rotate, Translate, Scale strings: */
- InteractString Strings[INTERACT_NUM_OF_STRINGS];
- InteractSubWindow SubWindows[INTERACT_NUM_OF_SUB_WNDWS];
- } InteractWindowStruct;
-
- /* Interactive mode menu set up structure is define below: */
- static InteractWindowStruct InteractMenu =
- {
- {
- { 0.5, 0.76, IG_IRIT_RED, "Rotate" },
- { 0.5, 0.56, IG_IRIT_GREEN, "Translate" },
- { 0.5, 0.36, IG_IRIT_CYAN, "Scale" },
- },
- {
- { 0.5, 0.92, IG_IRIT_YELLOW, IG_EVENT_SCR_OBJ_TGL, TRUE, "Screen Coords." },
- { 0.5, 0.84, IG_IRIT_BLUE, IG_EVENT_PERS_ORTHO_TGL, TRUE, "Perspective" },
- { 0.5, 0.79, IG_IRIT_BLUE, IG_EVENT_PERS_ORTHO_Z, FALSE, "Z" },
- { 0.5, 0.69, IG_IRIT_RED, IG_EVENT_ROTATE_X, FALSE, "X" }, /* Rot */
- { 0.5, 0.64, IG_IRIT_RED, IG_EVENT_ROTATE_Y, FALSE, "Y" },
- { 0.5, 0.59, IG_IRIT_RED, IG_EVENT_ROTATE_Z, FALSE, "Z" },
- { 0.5, 0.49, IG_IRIT_GREEN, IG_EVENT_TRANSLATE_X, FALSE, "X" },/* Trans */
- { 0.5, 0.44, IG_IRIT_GREEN, IG_EVENT_TRANSLATE_Y, FALSE, "Y" },
- { 0.5, 0.39, IG_IRIT_GREEN, IG_EVENT_TRANSLATE_Z, FALSE, "Z" },
- { 0.5, 0.29, IG_IRIT_CYAN, IG_EVENT_SCALE, FALSE, "" }, /* Scale */
- { 0.5, 0.21, IG_IRIT_YELLOW, IG_EVENT_DEPTH_CUE, TRUE, "Depth Cue" },
- { 0.5, 0.16, IG_IRIT_YELLOW, IG_EVENT_SAVE_MATRIX, TRUE, "Save Matrix" },
- { 0.5, 0.12, IG_IRIT_YELLOW, IG_EVENT_PUSH_MATRIX, TRUE, "Push Matrix" },
- { 0.5, 0.08, IG_IRIT_YELLOW, IG_EVENT_POP_MATRIX, TRUE, "Pop Matrix" },
- { 0.5, 0.03, IG_IRIT_WHITE, IG_EVENT_QUIT, TRUE, "Quit" },
- }
- };
-
- /* Colors to be used for viewed object (see also iritgrap.h): */
- /* This colors are adjusted so as to give OS2 2.x a better chance at */
- /* selecting these colors as solid. */
- static short Colors[IG_MAX_COLOR + 1][3] =
- {
- { 0, 0, 0 }, /* 0. BLACK */
- { 0, 0, 255 }, /* 1. BLUE */
- { 0, 255, 0 }, /* 2. GREEN */
- { 0, 255, 255 }, /* 3. CYAN */
- { 255, 0, 0 }, /* 4. RED */
- { 255, 0, 255 }, /* 5. MAGENTA */
- { 127, 127, 0 }, /* 6. BROWN */
- { 127, 127, 127 }, /* 7. LIGHTGREY */
- { 63, 63, 63 }, /* 8. DARKGRAY */
- { 63, 63, 255 }, /* 9. LIGHTBLUE */
- { 63, 255, 63 }, /* 10. LIGHTGREEN */
- { 63, 255, 255 }, /* 11. LIGHTCYAN */
- { 255, 63, 63 }, /* 12. LIGHTRED */
- { 255, 63, 255 }, /* 13. LIGHTMAGENTA */
- { 255, 255, 63 }, /* 14. YELLOW */
- { 255, 255, 255 } /* 15. WHITE */
- };
-
- static unsigned int
- TransWidth = DEFAULT_TRANS_WIDTH,
- TransHeight = DEFAULT_TRANS_HEIGHT,
- TransWidth2 = DEFAULT_TRANS_WIDTH / 2,
- ViewWidth2 = DEFAULT_VIEW_WIDTH / 2,
- ViewHeight2 = DEFAULT_VIEW_HEIGHT / 2;
-
- static LONG CrntColorLowIntensity, CrntColorHighIntensity,
- ColorsLowIntensity[IG_MAX_COLOR + 1], ColorsHighIntensity[IG_MAX_COLOR + 1];
- static HPS
- CurrentHps = 0;
- static HWND
- hwndMenu = 0,
- hwndFrame = 0,
- hwndClient = 0,
- hwndViewFrame = 0,
- hwndTransFrame = 0;
-
- static void GetInputFromSocket(void *Data);
- static MRESULT TransWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
- static MRESULT ViewWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
- static MRESULT ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
- static IGGraphicEventType GetGraphicEvent(RealType *ChangeFactor, int X, int Y);
- static void RedrawViewWindow(HWND hwnd);
- static void RedrawTransformationWindow(HWND hwnd);
- static void SetColorIndex(int c);
- static void SetColorRGB(int Color[3]);
-
- /****************************************************************************
- * Pop up all windows, read input and display. *
- ****************************************************************************/
- void main(int argc, char **argv)
- {
- static ULONG flFrameFlags;
- static char
- *szClientClass = "os2iritdrv.Client",
- *szViewClass = "os2iritdrv.View",
- *szTransClass = "os2iritdrv.Trans";
- char
- *IritPos = getenv("IRIT_POS");
- int i,
- Xmin = 190,
- Ymin = 190,
- Width = 600,
- Height = 400;
- QMSG qMsg;
- HPS hps;
- HAB hab;
- HMQ hmq;
- RECTL rcl, DeskTopRcl;
-
- IGConfigureGlobals("os2drvs", argc, argv);
- if (getenv("IRIT_DISPLAY_S") != NULL)
- IGGlblStandAlone = FALSE;
-
- if (IritPos)
- sscanf(IritPos, "%d %d %d %d", &Xmin, &Ymin, &Width, &Height);
-
- hab = WinInitialize(0);
- hmq = WinCreateMsgQueue(hab, 0);
-
- WinRegisterClass(hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0L);
- WinRegisterClass(hab, szViewClass, ViewWndProc, CS_SIZEREDRAW, 0L);
- WinRegisterClass(hab, szTransClass, TransWndProc, CS_SIZEREDRAW, 0L);
-
- flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
- FCF_SIZEBORDER | FCF_MINMAX |
- FCF_SHELLPOSITION | FCF_TASKLIST |
- FCF_MENU;
-
- hwndFrame = WinCreateStdWindow(
- HWND_DESKTOP,
- 0,
- &flFrameFlags,
- szClientClass,
- NULL,
- 0L,
- 0,
- ID_OS2DRVS,
- &hwndClient);
-
- WinQueryWindowRect(HWND_DESKTOP, &DeskTopRcl);
-
- if (DeskTopRcl.yTop < Ymin + Height) /* Make sure top side is visible. */
- Ymin = DeskTopRcl.yTop - Height;
-
- WinSetWindowPos(hwndFrame, HWND_TOP, Xmin, Ymin, Width, Height,
- SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER);
-
- WinQueryWindowRect(hwndClient, &rcl);
- flFrameFlags &= (~FCF_TASKLIST & ~FCF_MENU);
-
- hwndViewFrame = WinCreateWindow(
- hwndClient,
- szViewClass,
- NULL,
- WS_VISIBLE,
- 5,
- 5,
- (SHORT) ((rcl.xRight * 4) / 5 - 10),
- (SHORT) (rcl.yTop - 10),
- hwndClient,
- HWND_BOTTOM,
- ID_VIEW,
- NULL,
- NULL);
-
- hwndTransFrame = WinCreateWindow(
- hwndClient,
- szTransClass,
- NULL,
- WS_VISIBLE,
- (SHORT) ((rcl.xRight * 4) / 5),
- 5,
- (SHORT) (rcl.xRight / 5 - 5),
- (SHORT) (rcl.yTop - 10),
- hwndClient,
- HWND_BOTTOM,
- ID_TRANS,
- NULL,
- NULL);
-
- if (hwndViewFrame == 0 || hwndTransFrame == 0) {
- DosBeep(1000, 100);
- exit(1);
- }
-
- /* Preallocate the colors that will be used frequently. */
- hps = WinBeginPaint(hwndFrame, NULL, NULL);
- for (i = 0; i <= IG_MAX_COLOR; i++) {
- ColorsHighIntensity[i] =
- GpiQueryColorIndex(hps, 0L,
- RGB_COLOR(Colors[i][0], Colors[i][1], Colors[i][2]));
- ColorsLowIntensity[i] =
- GpiQueryColorIndex(hps, 0L,
- RGB_COLOR(Colors[i][0] / 2,
- Colors[i][1] / 2,
- Colors[i][2] / 2));
- }
- WinEndPaint(hps);
-
- /* Set up the reading socket as a secondary threat. */
- if (!IGGlblStandAlone) {
- if (_beginthread(GetInputFromSocket, NULL, 128 * 1024, NULL) == -1) {
- WinMessageBox(HWND_DESKTOP, hwndFrame, "Failed to start thread\n",
- NULL, 0, MB_OK);
- exit(1);
- }
- }
-
- while (WinGetMsg(hab, &qMsg, 0L, 0, 0))
- WinDispatchMsg(hab, &qMsg);
-
- WinDestroyWindow(hwndFrame);
- WinDestroyMsgQueue(hmq);
- WinTerminate(hab);
- }
-
- /*****************************************************************************
- * Updates the toggles in the menu. *
- *****************************************************************************/
- void IGCreateStateMenu(void)
- {
- WIN_CHECK_MENU(IDM_TGLS_SCREEN,
- IGGlblTransformMode == IG_TRANS_SCREEN ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_PERSP,
- IGGlblViewMode == IG_VIEW_PERSPECTIVE ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_DEPTH_CUE, IGGlblDepthCue ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_INTERNAL, IGGlblDrawInternal ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_VRTX_NRML, IGGlblDrawVNormal ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_POLY_NRML, IGGlblDrawPNormal ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_CTL_MESH, IGGlblDrawSurfaceMesh ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_SRF_POLYS, IGGlblDrawSurfacePoly ? MIA_CHECKED : 0);
- WIN_CHECK_MENU(IDM_TGLS_4_PER_FLAT, IGGlblFourPerFlat ? MIA_CHECKED : 0);
- }
-
- /*****************************************************************************
- * A secondary threat that waits for input from socket. *
- *****************************************************************************/
- static void GetInputFromSocket(void *Data)
- {
- SocClientCreateSocket();
-
- while (TRUE) {
- if (IGReadObjectsFromSocket(IGGlblViewMode, &IGGlblDisplayList))
- WinInvalidateRect(hwndViewFrame, NULL, FALSE);
- }
- }
-
- /****************************************************************************
- * Trans window drawing function. *
- ****************************************************************************/
- static MRESULT TransWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
- {
- static IGGraphicEventType
- LastEvent = IG_EVENT_NONE;
- static int
- LastX = 0,
- Button1Down = FALSE;
- RealType ChangeFactor;
- IGGraphicEventType Event;
- int x, y;
-
- switch (msg) {
- case WM_CREATE:
- break;
- case WM_BUTTON1UP:
- Button1Down = FALSE;
- break;
- case WM_BUTTON1DOWN:
- LastEvent = IG_EVENT_NONE;
- x = SHORT1FROMMP(mp1);
- y = SHORT2FROMMP(mp1);
-
- if ((Event = GetGraphicEvent(&ChangeFactor, x, y))
- != IG_EVENT_NONE) {
- if (Event == IG_EVENT_QUIT) {
- exit(0); /* Not the nicest ways to quit. */
- }
- else {
- if (IGProcessEvent(Event,
- ChangeFactor * IGGlblChangeFactor))
- WinInvalidateRect(hwndViewFrame, NULL, TRUE);
-
- /* Save the event in case drag operation is performed. */
- LastEvent = Event;
- LastX = x;
- }
- }
- Button1Down = TRUE;
- break;
- case WM_MOUSEMOVE:
- if (Button1Down && LastEvent != IG_EVENT_NONE) {
- ChangeFactor = ((x = SHORT1FROMMP(mp1)) - ((RealType) LastX)) /
- TransWidth2;
- if (IGProcessEvent(LastEvent,
- ChangeFactor * IGGlblChangeFactor))
- WinInvalidateRect(hwndViewFrame, NULL, TRUE);
- LastX = x;
- }
- break;
- case WM_PAINT:
- RedrawTransformationWindow(hwnd);
- break;
- case WM_COMMAND:
- break;
- }
- return WinDefWindowProc(hwnd, msg, mp1, mp2);
- }
-
- /****************************************************************************
- * View window drawing function. *
- ****************************************************************************/
- static MRESULT ViewWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
- {
- switch (msg) {
- case WM_PAINT:
- RedrawViewWindow(hwnd);
- break;
- case WM_COMMAND:
- switch (SHORT1FROMMP(mp1)) {
- }
- break;
- }
- return WinDefWindowProc(hwnd, msg, mp1, mp2);
- }
-
- /****************************************************************************
- * Frame window drawing function. *
- ****************************************************************************/
- static MRESULT ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
- {
- POINTL Pt;
- RECTL rcl;
- HPS hps;
- int Refresh;
- FILEDLG fild;
- static int
- Resized = FALSE;
-
- switch (msg) {
- case WM_CREATE:
- hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
- FID_MENU);
- break;
- case WM_SIZE:
- Resized = TRUE;
- break;
- case WM_PAINT:
- hps = WinBeginPaint(hwnd, NULL, NULL);
-
- WinQueryWindowRect(hwnd, &rcl);
- GpiSetColor(hps, CLR_WHITE);
- Pt.x = Pt.y = 0;
- GpiMove(hps, &Pt);
- Pt.x = rcl.xRight;
- Pt.y = rcl.yTop;
- GpiBox(hps, DRO_OUTLINEFILL, &Pt, 0, 0);
-
- WinEndPaint(hps);
-
- if (Resized) {
- Resized = FALSE;
-
- if (hwndViewFrame)
- WinSetWindowPos(hwndViewFrame, HWND_BOTTOM, 5, 5,
- (SHORT) ((rcl.xRight * 4) / 5 - 10),
- (SHORT) (rcl.yTop - 10),
- SWP_SIZE | SWP_MOVE);
- if (hwndTransFrame)
- WinSetWindowPos(hwndTransFrame, HWND_BOTTOM,
- (SHORT) (rcl.xRight * 4 / 5), 5,
- (SHORT) (rcl.xRight / 5 - 5),
- (SHORT) (rcl.yTop - 10),
- SWP_SIZE | SWP_MOVE);
- }
- break;
- case WM_COMMAND:
- Refresh = FALSE;
- switch (SHORT1FROMMP(mp1)) {
- case IDM_FILE_SAVE:
- IGSaveCurrentMat(IGGlblViewMode, NULL);
- break;
- case IDM_FILE_SAVE_AS:
- memset(&fild, 0, sizeof(FILEDLG));
- fild.cbSize = sizeof(FILEDLG);
- fild.pszTitle = "Save View Matrix";
- fild.pszOKButton = "Save";
- fild.fl = FDS_OPEN_DIALOG | FDS_CENTER ;
- WinFileDlg(HWND_DESKTOP, hwndClient, &fild);
-
- if (strlen(fild.szFullFile) > 0)
- IGSaveCurrentMat(IGGlblViewMode, fild.szFullFile);
- break;
- case IDM_FILE_QUIT:
- exit(0);
- break;
-
- case IDM_MOUSE_MORE:
- IGHandleState(IG_STATE_MORE_SENSITIVE, TRUE);
- break;
- case IDM_MOUSE_LESS:
- IGHandleState(IG_STATE_LESS_SENSITIVE, TRUE);
- break;
-
- case IDM_STATE_MORE_ISO:
- Refresh = IGHandleState(IG_STATE_MORE_ISOLINES, TRUE);
- break;
- case IDM_STATE_LESS_ISO:
- Refresh = IGHandleState(IG_STATE_LESS_ISOLINES, TRUE);
- break;
- case IDM_STATE_FINER_APPROX:
- Refresh = IGHandleState(IG_STATE_FINER_APPROX, TRUE);
- break;
- case IDM_STATE_COARSER_APPROX:
- Refresh = IGHandleState(IG_STATE_COARSER_APPROX, TRUE);
- break;
- case IDM_STATE_SHORTER_VEC:
- Refresh = IGHandleState(IG_STATE_SHORTER_VECTORS, TRUE);
- break;
- case IDM_STATE_LONGER_VEC:
- Refresh = IGHandleState(IG_STATE_LONGER_VECTORS, TRUE);
- break;
- case IDM_STATE_WIDE_LINES:
- Refresh = IGHandleState(IG_STATE_WIDER_LINES, TRUE);
- break;
- case IDM_STATE_THIN_LINES:
- Refresh = IGHandleState(IG_STATE_NARROW_LINES, TRUE);
- break;
-
- case IDM_TGLS_SCREEN:
- IGHandleState(IG_STATE_SCR_OBJ_TGL, TRUE);
- break;
- case IDM_TGLS_PERSP:
- Refresh = IGHandleState(IG_STATE_PERS_ORTHO_TGL, TRUE);
- break;
- case IDM_TGLS_DEPTH_CUE:
- Refresh = IGHandleState(IG_STATE_DEPTH_CUE, TRUE);
- break;
- case IDM_TGLS_INTERNAL:
- Refresh = IGHandleState(IG_STATE_DRAW_INTERNAL, TRUE);
- break;
- case IDM_TGLS_VRTX_NRML:
- Refresh = IGHandleState(IG_STATE_DRAW_VNORMAL, TRUE);
- break;
- case IDM_TGLS_POLY_NRML:
- Refresh = IGHandleState(IG_STATE_DRAW_PNORMAL, TRUE);
- break;
- case IDM_TGLS_CTL_MESH:
- Refresh = IGHandleState(IG_STATE_DRAW_SRF_MESH, TRUE);
- break;
- case IDM_TGLS_SRF_POLYS:
- Refresh = IGHandleState(IG_STATE_DRAW_SRF_POLY, TRUE);
- break;
- case IDM_TGLS_4_PER_FLAT:
- Refresh = IGHandleState(IG_STATE_FOUR_PER_FLAT, TRUE);
- break;
-
- case IDM_VIEW_FRONT:
- Refresh = IGHandleState(IG_STATE_VIEW_FRONT, TRUE);
- break;
- case IDM_VIEW_SIDE:
- Refresh = IGHandleState(IG_STATE_VIEW_SIDE, TRUE);
- break;
- case IDM_VIEW_TOP:
- Refresh = IGHandleState(IG_STATE_VIEW_TOP, TRUE);
- break;
- case IDM_VIEW_ISOMETRY:
- Refresh = IGHandleState(IG_STATE_VIEW_ISOMETRY, TRUE);
- break;
- }
- if (Refresh)
- WinInvalidateRect(hwndViewFrame, NULL, FALSE);
- break;
- }
- return WinDefWindowProc(hwnd, msg, mp1, mp2);
- }
-
- /******************************************************************************
- * Get an XY location on the transformation window and computes the evnet. *
- ******************************************************************************/
- static IGGraphicEventType GetGraphicEvent(RealType *ChangeFactor, int X, int Y)
- {
- int i;
- IGGraphicEventType
- RetVal = IG_EVENT_NONE;
- RealType XPos, YPos;
-
- XPos = ((RealType) X) / TransWidth;
- YPos = ((RealType) Y) / TransHeight;
-
- /* Make sure we are in bound in the X direction. */
- if (XPos < (1.0 - INTERACT_SUB_WINDOW_WIDTH) / 2.0 ||
- XPos > 1.0 - (1.0 - INTERACT_SUB_WINDOW_WIDTH) / 2.0)
- return IG_EVENT_NONE;
-
- /* Now search the sub window the event occured in. */
- for (i = 0; i < INTERACT_NUM_OF_SUB_WNDWS; i++) {
- if (InteractMenu.SubWindows[i].Y <= YPos &&
- InteractMenu.SubWindows[i].Y + INTERACT_SUB_WINDOW_HEIGHT >=
- YPos) {
- RetVal = InteractMenu.SubWindows[i].Event;
- break;
- }
- }
-
- /* Take care of special cases in which the window should be updated. */
- switch (RetVal) {
- case IG_EVENT_SCR_OBJ_TGL:
- IGGlblTransformMode = IGGlblTransformMode == IG_TRANS_OBJECT ?
- IG_TRANS_SCREEN :
- IG_TRANS_OBJECT;
- WinInvalidateRect(hwndTransFrame, NULL, TRUE);
- IGCreateStateMenu();
- break;
- case IG_EVENT_PERS_ORTHO_TGL:
- IGGlblViewMode = IGGlblViewMode == IG_VIEW_PERSPECTIVE ?
- IG_VIEW_ORTHOGRAPHIC :
- IG_VIEW_PERSPECTIVE;
- WinInvalidateRect(hwndTransFrame, NULL, TRUE);
- IGCreateStateMenu();
- break;
- case IG_EVENT_DEPTH_CUE:
- IGGlblDepthCue = !IGGlblDepthCue;
- WinInvalidateRect(hwndTransFrame, NULL, TRUE);
- IGCreateStateMenu();
- break;
- default:
- break;
- }
-
- *ChangeFactor = (((RealType) X) - TransWidth2) / TransWidth2;
-
- return RetVal;
- }
-
- /*****************************************************************************
- * Redraw the viewing window. *
- *****************************************************************************/
- static void RedrawViewWindow(HWND hwnd)
- {
- RECTL rcl;
- IPObjectStruct *PObj;
-
- switch (IGGlblViewMode) { /* Update the current view. */
- case IG_VIEW_ORTHOGRAPHIC:
- GEN_COPY(IGGlblCrntViewMat, IritPrsrViewMat, sizeof(MatrixType));
- break;
- case IG_VIEW_PERSPECTIVE:
- MatMultTwo4by4(IGGlblCrntViewMat, IritPrsrViewMat,
- IritPrsrPrspMat);
- break;
- }
-
- CurrentHps = WinBeginPaint(hwnd, NULL, NULL);
- WinQueryWindowRect(hwnd, &rcl);
- ViewWidth2 = rcl.xRight / 2;
- ViewHeight2 = rcl.yTop / 2;
- WinFillRect(CurrentHps, &rcl, CLR_BLUE);
-
- /* Slim chance that a race will oocur if the following test and set */
- /* is done simultanuously. Should use semaphors probably. */
- while (IGGlblDisplayListIsUsed) {
- IritSleep(10);
- DosEnterCritSec();
- if (!IGGlblDisplayListIsUsed) {
- IGGlblDisplayListIsUsed = TRUE;
- DosExitCritSec();
- break;
- }
- DosExitCritSec();
- }
-
- GpiSetLineWidthGeom(CurrentHps, IGGlblLineWidth);
-
- for (PObj = IGGlblDisplayList, IGGlblAbortKeyPressed = FALSE;
- PObj != NULL && !IGGlblAbortKeyPressed;
- PObj = PObj -> Pnext)
- IGDrawObject(PObj);
-
- IGGlblDisplayListIsUsed = FALSE;
-
- WinEndPaint(CurrentHps);
- CurrentHps = 0;
- }
-
- /*****************************************************************************
- * Redraw the transformation window. *
- *****************************************************************************/
- static void RedrawTransformationWindow(HWND hwnd)
- {
- int i, cxChar, cyChar,
- SubTransWidth, SubTransHeight, SubTransPosX, SubTransPosY;
- POINTL Pt;
- RECTL rcl;
- FONTMETRICS fm;
- HPS hps = WinBeginPaint(hwnd, NULL, NULL);
-
- GpiQueryFontMetrics(WinGetPS(hwnd), (LONG) sizeof(fm), &fm);
- cxChar = fm.lAveCharWidth;
- cyChar = fm.lMaxBaselineExt;
-
- /* Make sure the menu is consistent with internatal data. */
- InteractMenu.SubWindows[0].Str =
- IGGlblTransformMode == IG_TRANS_OBJECT ? "Object Coords."
- : "Screen Coords.";
- InteractMenu.SubWindows[1].Str =
- IGGlblViewMode == IG_VIEW_PERSPECTIVE ? "Perspective"
- : "Orthographic";
- InteractMenu.SubWindows[10].Str =
- IGGlblDepthCue ? "Depth cue" : "No depth cue";
-
- WinQueryWindowRect(hwnd, &rcl);
- TransWidth = rcl.xRight;
- TransWidth2 = rcl.xRight / 2;
- TransHeight = rcl.yTop;
-
- SubTransWidth = (int) (TransWidth * INTERACT_SUB_WINDOW_WIDTH);
- SubTransHeight = (int) (TransHeight *
- INTERACT_SUB_WINDOW_HEIGHT);
- SubTransPosX = (TransWidth - SubTransWidth) / 2;
-
- GpiSetColor(hps, CLR_BLACK);
- Pt.x = Pt.y = 0;
- GpiMove(hps, &Pt);
- Pt.x = TransWidth;
- Pt.y = TransHeight;
- GpiBox(hps, DRO_OUTLINEFILL, &Pt, 0, 0);
-
- for (i = 0; i < INTERACT_NUM_OF_SUB_WNDWS; i++) {
- GpiSetColor(hps, InteractMenu.SubWindows[i].Color);
- SubTransPosY = (int) (TransHeight *
- InteractMenu.SubWindows[i].Y);
-
- GPI_MOVE(SubTransPosX, SubTransPosY);
- GPI_LINE(SubTransPosX + SubTransWidth, SubTransPosY);
- GPI_LINE(SubTransPosX + SubTransWidth,
- SubTransPosY + SubTransHeight);
- GPI_LINE(SubTransPosX, SubTransPosY + SubTransHeight);
- GPI_LINE(SubTransPosX, SubTransPosY);
- if (InteractMenu.SubWindows[i].TextInside) {
- GPI_CHAR_STR_AT(InteractMenu.SubWindows[i].Str,
- TransWidth / 2,
- SubTransPosY + SubTransHeight / 2);
- }
- else {
- GPI_CHAR_STR_AT(InteractMenu.SubWindows[i].Str,
- (TransWidth - SubTransWidth) / 3,
- SubTransPosY + SubTransHeight / 2);
- GPI_MOVE(SubTransPosX + SubTransWidth / 2, SubTransPosY);
- GPI_LINE(SubTransPosX + SubTransWidth / 2,
- SubTransPosY + SubTransHeight);
- }
- }
-
- for (i = 0; i < INTERACT_NUM_OF_STRINGS; i++) {
- GpiSetColor(hps, InteractMenu.Strings[i].Color);
- GPI_CHAR_STR_AT(InteractMenu.Strings[i].Str,
- (int) (InteractMenu.Strings[i].X * TransWidth),
- (int) (InteractMenu.Strings[i].Y * TransHeight));
- }
-
- WinEndPaint(hps);
- }
-
- /****************************************************************************
- * Routine to move in 2D normalized (-1..1) view space. *
- ****************************************************************************/
- void IGMoveTo2D(RealType X, RealType Y)
- {
- POINTL Pt;
-
- Pt.x = OS2_MAP_X_COORD(X);
- Pt.y = OS2_MAP_Y_COORD(Y);
- GpiMove(CurrentHps, &Pt);
- }
-
- /****************************************************************************
- * Routine to draw in 2D normalized (-1..1) view space. *
- ****************************************************************************/
- void IGLineTo2D(RealType X, RealType Y)
- {
- POINTL Pt;
-
- Pt.x = OS2_MAP_X_COORD(X);
- Pt.y = OS2_MAP_Y_COORD(Y);
- GpiLine(CurrentHps, &Pt);
- }
-
- /****************************************************************************
- * Routine to set the intensity of a color (high or low). *
- ****************************************************************************/
- void IGSetColorIntensity(int High)
- {
- if (!CurrentHps)
- return;
- GpiSetColor(CurrentHps,
- High ? CrntColorHighIntensity : CrntColorLowIntensity);
-
- IGGlblIntensityHighState = High;
- }
-
- /****************************************************************************
- * Routine to set the color according to the given object's color. *
- ****************************************************************************/
- void IGSetColorObj(IPObjectStruct *PObj)
- {
- int c, Color[3];
-
- if (AttrGetObjectRGBColor(PObj, &Color[0], &Color[1], &Color[2])) {
- SetColorRGB(Color);
- }
- else if ((c = AttrGetObjectColor(PObj)) != IP_ATTR_NO_COLOR) {
- SetColorIndex(c);
- }
- else {
- /* Use white as default color: */
- SetColorIndex(IG_IRIT_WHITE);
- }
- }
-
- /****************************************************************************
- * Routine to set the color according to the given color index. *
- ****************************************************************************/
- static void SetColorIndex(int color)
- {
- if (color > IG_MAX_COLOR)
- color = IG_IRIT_WHITE;
-
- CrntColorHighIntensity = ColorsHighIntensity[color];
- CrntColorLowIntensity = ColorsLowIntensity[color];
-
- if (CurrentHps) {
- GpiSetColor(CurrentHps, CrntColorHighIntensity);
- }
-
- IGGlblIntensityHighState = TRUE;
- }
-
- /****************************************************************************
- * Routine to set the color according to the given RGB values. *
- ****************************************************************************/
- static void SetColorRGB(int Color[3])
- {
- if (!CurrentHps)
- return;
-
- CrntColorHighIntensity =
- GpiQueryColorIndex(CurrentHps, 0L,
- RGB_COLOR(Color[0], Color[1], Color[2]));
- CrntColorLowIntensity =
- GpiQueryColorIndex(CurrentHps, 0L,
- RGB_COLOR(Color[0] / 2, Color[1] / 2, Color[2] / 2));
-
- GpiSetColor(CurrentHps, CrntColorHighIntensity);
-
- IGGlblIntensityHighState = TRUE;
- }
-
- /******************************************************************************
- * Handle the event of a pop up window. *
- ******************************************************************************/
- int IGHandleState(int State, int Refresh)
- {
- int UpdateView = TRUE;
-
- switch (State) {
- case IG_STATE_WIDER_LINES:
- IGGlblLineWidth *= 2;
- break;
- case IG_STATE_NARROW_LINES:
- IGGlblLineWidth /= 2;
- if (IGGlblLineWidth < 1)
- IGGlblLineWidth = 1;
- break;
- case IG_STATE_SCR_OBJ_TGL:
- case IG_STATE_PERS_ORTHO_TGL:
- case IG_STATE_DEPTH_CUE:
- WinInvalidateRect(hwndTransFrame, NULL, TRUE);
- default:
- UpdateView = IGDefaultStateHandler(State, Refresh);
- break;
- }
-
- WinInvalidateRect(hwndTransFrame, NULL, TRUE);
- IGCreateStateMenu();
-
- return UpdateView;
- }
-
- /*****************************************************************************
- * Routine to make some sound. *
- *****************************************************************************/
- void IGIritBeep(void)
- {
- DosBeep(1000, 100);
- }
-